有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java和YAML:如何解析多个YAML文档并将它们合并到单个YAML表示?

假设我有一个文件,defaults.yaml

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: dev
  password: dev_password

和另一个文件production.yaml

pool:
  username: prod
  password: prod_password

在运行时,如何读取这两个文件并将它们合并为一个文件,以便应用程序“看到”以下内容

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: prod
  password: prod_password

比如说,SnakeYAML有可能实现这一点吗?还有其他工具吗

我知道一种选择是将多个文件作为贴图读取,然后自己合并,将合并渲染为一个临时文件,然后读取,但这是一种重量级的解决方案。现有的工具已经可以这样做了吗


共 (1) 个答案

  1. # 1 楼答案

    你可以使用Jackson,关键是使用ObjectMapper。ReaderForUpdate()并用@JsonMerge注释该字段(或者下一个对象中所有缺失的字段将覆盖旧字段):

    马文:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.9.9</version>
        </dependency>
    

    代码:

    public class TestJackson {
        public static void main(String[] args) throws IOException {
            ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
            MyConfig myConfig = new MyConfig();
            ObjectReader objectReader = mapper.readerForUpdating(myConfig);
            objectReader.readValue(new File("misc/a.yaml"));
            objectReader.readValue(new File("misc/b.yaml"));
            System.out.println(myConfig);
        }
    
        @Data
        public static class MyConfig {
            @JsonMerge
            private Pool pool;
        }
    
        @Data
        public static class Pool {
            private Integer idleConnectionTestPeriodSeconds;
            private Integer idleMaxAgeInMinutes;
            private Integer partitionCount;
            private Integer acquireIncrement;
            private String username;
            private String password;
        }
    }